#!/bin/bash

# 命令行功能测试脚本

echo "开始命令行功能测试..."

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # No Color

# 测试计数器
TESTS_PASSED=0
TESTS_FAILED=0

# 测试函数
run_test() {
    local test_name="$1"
    local test_command="$2"
    local expected_exit_code="$3"
    
    echo -n "测试 $test_name ... "
    
    # 执行命令并捕获退出码
    eval "$test_command" >/dev/null 2>&1
    local actual_exit_code=$?
    
    if [ $actual_exit_code -eq $expected_exit_code ]; then
        echo -e "${GREEN}通过${NC}"
        ((TESTS_PASSED++))
        return 0
    else
        echo -e "${RED}失败${NC} (期望退出码: $expected_exit_code, 实际: $actual_exit_code)"
        ((TESTS_FAILED++))
        return 1
    fi
}

# 确保父目录中有moparse可执行文件
if [ ! -f "../moparse" ]; then
    echo "构建moparse..."
    cd .. && make
    if [ $? -ne 0 ]; then
        echo -e "${RED}无法构建moparse${NC}"
        exit 1
    fi
    cd tests
fi

# 创建测试用的Verilog文件
create_test_files() {
    cat > test_module.v << 'EOF'
module test_counter (
    input clk,
    input reset,
    input enable,
    output reg [7:0] count
);

parameter MAX_COUNT = 255;

always @(posedge clk or posedge reset) begin
    if (reset)
        count <= 8'b0;
    else if (enable)
        count <= count + 1;
end

endmodule
EOF

    cat > test_list.txt << 'EOF'
test_module.v
EOF

    cat > invalid_syntax.v << 'EOF'
module invalid_module (
    input clk
    // 故意缺少分号和endmodule
EOF
}

# 清理函数
cleanup() {
    rm -f test_module.v test_list.txt invalid_syntax.v
    rm -f output.modb existing.modb test.modb
    rm -f *.v  # 清理生成的Verilog文件
}

# 创建测试文件
create_test_files

echo "运行命令行接口测试..."

# 测试1: 显示帮助
run_test "显示帮助信息" "../moparse -h" 0

# 测试2: 显示版本
run_test "显示版本信息" "../moparse --version" 0

# 测试3: 解析Verilog文件到.modb
run_test "解析Verilog文件" "../moparse -v test_module.v -o output.modb" 0

# 测试4: 验证输出文件存在
if [ -f "output.modb" ]; then
    echo -n "验证输出文件存在 ... "
    echo -e "${GREEN}通过${NC}"
    ((TESTS_PASSED++))
else
    echo -n "验证输出文件存在 ... "
    echo -e "${RED}失败${NC}"
    ((TESTS_FAILED++))
fi

# 测试5: 显示.modb文件信息
run_test "显示模块信息" "../moparse -s output.modb" 0

# 测试6: 显示详细信息
run_test "显示详细模块信息" "../moparse -sv output.modb" 0

# 测试7: 显示指定模块信息
run_test "显示指定模块信息" "../moparse -s output.modb -m test_counter" 0

# 测试8: 解析文件列表
run_test "解析文件列表" "../moparse -f test_list.txt -o test.modb" 0

# 测试9: 合并到现有文件
run_test "合并到现有文件" "../moparse -v test_module.v -e output.modb" 0

# 测试10: 删除模块
cp output.modb existing.modb
run_test "删除指定模块" "../moparse -i existing.modb -dm test_counter" 0

# 测试11: 错误处理 - 不存在的文件
run_test "处理不存在的文件" "../moparse -v nonexistent.v -o test.modb" 1

# 测试12: 错误处理 - 无效参数
run_test "处理无效参数" "../moparse -xyz" 1

# 测试13: 错误处理 - 缺少输出文件
run_test "处理缺少输出文件" "../moparse -v test_module.v" 1

# 测试14: 只解析指定模块
run_test "只解析指定模块" "../moparse -v test_module.v -o test.modb -m test_counter" 0

# 测试15: 验证删除操作的效果
if [ -f "existing.modb" ]; then
    # 检查模块是否真的被删除了
    if ../moparse -s existing.modb -m test_counter 2>/dev/null | grep -q "test_counter"; then
        echo -n "验证模块删除效果 ... "
        echo -e "${RED}失败${NC} (模块未被删除)"
        ((TESTS_FAILED++))
    else
        echo -n "验证模块删除效果 ... "
        echo -e "${GREEN}通过${NC}"
        ((TESTS_PASSED++))
    fi
fi

# 测试16-19: 测试反向生成功能
run_test "反向生成空壳模块" "../moparse -i output.modb -m test_counter -oe empty_module.v" 0
run_test "反向生成stub模块" "../moparse -i output.modb -m test_counter -oes stub_module.v" 0  
run_test "反向生成完整模块" "../moparse -i output.modb -m test_counter -oa full_module.v" 0
run_test "反向生成实例代码" "../moparse -i output.modb -m test_counter -oi instance_code.v" 0

# 测试20: 验证生成文件存在
for file in empty_module.v stub_module.v full_module.v instance_code.v; do
    if [ -f "$file" ]; then
        echo -n "验证生成文件 $file 存在 ... "
        echo -e "${GREEN}通过${NC}"
        ((TESTS_PASSED++))
    else
        echo -n "验证生成文件 $file 存在 ... "
        echo -e "${RED}失败${NC}"
        ((TESTS_FAILED++))
    fi
done

# 清理测试文件
cleanup

# 输出测试总结
echo
echo "命令行测试总结:"
echo -e "通过: ${GREEN}$TESTS_PASSED${NC}"
echo -e "失败: ${RED}$TESTS_FAILED${NC}"
echo "总计: $((TESTS_PASSED + TESTS_FAILED))"

# 返回适当的退出码
if [ $TESTS_FAILED -eq 0 ]; then
    echo -e "\n${GREEN}所有命令行测试通过!${NC}"
    exit 0
else
    echo -e "\n${RED}有 $TESTS_FAILED 个测试失败${NC}"
    exit 1
fi